package com.xuetang.service;

import com.xuetang.entity.BloodSugarRecord;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 血糖记录服务接口
 */
public interface BloodSugarRecordService {

    /**
     * 根据用户ID和日期获取血糖记录
     * 
     * @param userId 用户ID
     * @param date   日期
     * @return 血糖记录列表
     */
    List<BloodSugarRecord> getByUserIdAndDate(Long userId, LocalDate date);

    /**
     * 根据用户ID和日期范围获取血糖记录
     * 
     * @param userId    用户ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 血糖记录列表
     */
    List<BloodSugarRecord> getByUserIdAndDateRange(Long userId, LocalDate startDate, LocalDate endDate);

    /**
     * 分页查询用户的血糖记录
     * 
     * @param userId 用户ID
     * @param type   测量类型
     * @param page   页码
     * @param size   每页大小
     * @return 分页结果
     */
    List<BloodSugarRecord> page(Long userId, Integer type, int page, int size);

    /**
     * 查询用户血糖记录总数
     * 
     * @param userId 用户ID
     * @param type   测量类型
     * @return 记录总数
     */
    int count(Long userId, Integer type);

    /**
     * 保存血糖记录，增加状态判断逻辑
     * 
     * @param record 血糖记录
     * @return 保存后的记录（带id）
     */
    BloodSugarRecord saveRecord(BloodSugarRecord record);

    /**
     * 更新血糖记录，增加状态判断逻辑
     * 
     * @param record 血糖记录
     * @return 更新后的记录
     */
    BloodSugarRecord updateRecord(BloodSugarRecord record);

    /**
     * 根据ID删除血糖记录
     * 
     * @param id     记录ID
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean deleteById(Long id, Long userId);

    /**
     * 根据ID获取血糖记录
     * 
     * @param id 记录ID
     * @return 血糖记录
     */
    BloodSugarRecord getById(Long id);

    /**
     * 获取用户血糖统计数据
     * 
     * @param userId    用户ID
     * @param timeRange 时间范围：day/week/month/year
     * @return 统计数据
     */
    Map<String, Object> getStatistics(Long userId, String timeRange);

    /**
     * 获取用户血糖趋势数据
     * 
     * @param userId    用户ID
     * @param timeRange 时间范围：day/week/month/year
     * @return 趋势数据，包括日期和平均血糖值
     */
    List<Map<String, Object>> getTrend(Long userId, String timeRange);

    /**
     * 获取用户各测量类型的血糖统计数据
     * 
     * @param userId    用户ID
     * @param timeRange 时间范围：day/week/month/year
     * @return 各测量类型的统计数据
     */
    List<Map<String, Object>> getByMeasureType(Long userId, String timeRange);

    /**
     * 管理员分页查询血糖记录
     * 
     * @param userId    用户ID，可为null
     * @param startDate 开始日期，可为null
     * @param endDate   结束日期，可为null
     * @param page      页码
     * @param size      每页大小
     * @return 血糖记录列表
     */
    List<BloodSugarRecord> pageForAdmin(Long userId, LocalDate startDate, LocalDate endDate, int page, int size);

    /**
     * 管理员查询血糖记录总数
     * 
     * @param userId    用户ID，可为null
     * @param startDate 开始日期，可为null
     * @param endDate   结束日期，可为null
     * @return 记录总数
     */
    int countForAdmin(Long userId, LocalDate startDate, LocalDate endDate);

    /**
     * 判断血糖值的状态
     * 
     * @param value       血糖值
     * @param measureType 测量类型
     * @return 状态码：1正常，2偏低，3偏高
     */
    int determineStatus(Double value, Integer measureType);
}